package reflect;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Scanner;

/**
 * java的反射机制
 * 反射是java的动态机制，允许程序在【运行期间】再确定如对象的实例化，属性操作，方法调用等。
 * 可以提高代码的灵活性，扩展性，维护性
 * 运行效率相对降低同时开销增多
 * 需要适度使用
 */
public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        //获取Class类对象的方式
        /*
     //通过class获取对象
     Class cls1 = String.class;
     Class cls2 = ArrayList.class;
     Class cls3 = int.class;

     //通过指定类的完全限定命虎丘区一个类的对象
        Class cls4 = Class.forName("java.lang.String");
        Class cls5 = Class.forName("java.util.ArrayList");
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入一个类名");
        String name = scan.nextLine();
        Class cls6 =Class.forName(name);

         */

        Scanner scan = new Scanner(System.in);
        System.out.println("请输入一个类名");
        String name = scan.nextLine();
        Class cls = Class.forName(name);

        System.out.println("获取类的完全限定名"+cls.getName());
        System.out.println("获取类名"+cls.getSimpleName());

        //包也是反射对象之一，每个实例用于表示一个包
        Package pack = cls.getPackage();
        System.out.println("获取包名："+pack.getName());

        //Method是反射对象知意，他的米一个示例用于表示一个类的方法
        Method[] methods = cls.getMethods();
        System.out.println("一共有"+methods.length+"个方法");
        for(Method method:methods){
            System.out.println(method.getName());
        }
    }
}
